//工具生成，请不要手动修改...
let w: any, r: any, StructCoder: any;
/** 传入k-coder来进行初始化 */
export function initMsg(kcoder: any) {
    w = new kcoder.BinaryWriter();
    r = new kcoder.BinaryReader();
    StructCoder = kcoder.StructCoder;
}

const tosCoderDic: any = {}, tocCoderDic: any = {};
/** 协议消息编解码 */
export const MsgCoder = {

    /** 加载单个协议消息结构 */
    load(msgId: any, struct: any) {
        let st: any;
        tosCoderDic[msgId] = (st = struct[msgId][0]) ? new StructCoder(st) : undefined;
        tocCoderDic[msgId] = (st = struct[msgId][1]) ? new StructCoder(st) : undefined;
    },

    /** 加载所有协议消息结构 */
    loadAll(struct: any, onCount?: (count: number) => void) {
        let c = 0;
        for (let msgId in struct) {
            MsgCoder.load(msgId, struct);
            onCount && onCount(++c);
        }
    },

    /** 编码协议消息id */
    encodeMsgId(msgId: MsgId) {
        w.start().uint = msgId;
    },

    /** 编码tos协议消息 */
    encodeTos(msgId: MsgId, data?: any): Uint8Array {
        tosCoderDic[msgId]?.encode(data, w);
        return w.end();
    },

    /** 编码toc协议消息 */
    encodeToc(msgId: MsgId, data?: any): Uint8Array {
        tocCoderDic[msgId]?.encode(data, w);
        return w.end();
    },

    /** 解码协议消息id */
    decodeMsgId(buf: Uint8Array) {
        return r.start(buf).uint;
    },

    /** 解码tos协议消息 */
    decodeTos(msgId: MsgId, buf?: Uint8Array) {
        return tosCoderDic[msgId]?.decode(buf || r);
    },

    /** 解码tos协议消息 */
    decodeToc(msgId: MsgId, buf?: Uint8Array) {
        return tocCoderDic[msgId]?.decode(buf || r);
    },

    /** 解码协议消息id后剩下的buf */
    getMsgBuf() {
        return r.cut(r.len - r.pos);
    }
}

/** 协议号 */
export enum MsgId {
    /** 玩家入屏 */
    addPlayer = 1,
    /** 玩家离屏 */
    delPlayer = 2,
    /** 玩家同步 */
    syncPlayer = 3,
    /** 获取服务器列表 */
    getSvrList = 1000,
    /** 获取服务器地址 */
    getSvrHost = 1001,
    /** 连接服务器 */
    connect = 1002,
    /** 创角 */
    createRole = 1003,
    /** 进入游戏 */
    joinGame = 1004,
    /** 客户端准备好进入地图了 */
    readyEnterMap = 1005,
}

/** 发往服务端的协议消息 */
export interface MsgTos {
    [MsgId.syncPlayer]: MsgVo.com.tos_syncPlayer
    [MsgId.getSvrHost]: MsgVo.login.tos_getSvrHost
    [MsgId.connect]: MsgVo.login.tos_connect
    [MsgId.createRole]: MsgVo.login.tos_createRole
}

/** 发往客户端的协议消息 */
export interface MsgToc {
    [MsgId.addPlayer]: MsgVo.com.toc_addPlayer
    [MsgId.delPlayer]: MsgVo.com.toc_delPlayer
    [MsgId.syncPlayer]: MsgVo.com.toc_syncPlayer
    [MsgId.getSvrList]: MsgVo.login.toc_getSvrList
    [MsgId.getSvrHost]: MsgVo.login.toc_getSvrHost
    [MsgId.connect]: MsgVo.login.toc_connect
    [MsgId.createRole]: MsgVo.login.toc_createRole
    [MsgId.joinGame]: MsgVo.login.toc_joinGame
}

/** 协议消息Vo */
export namespace MsgVo {

    export namespace com {

        export interface Player {
            /** 玩家id */
            pid: number,
            /** 名称 */
            name?: string,
            x?: number,
            y?: number,
            /** 角度 */
            ang?: number,
        }

        export interface toc_addPlayer {
            players: Player[],
        }

        export interface toc_delPlayer {
            pids: number[],
        }

        export interface tos_syncPlayer {
            x: number,
            y: number,
        }

        export interface toc_syncPlayer {
            players: Player[],
        }

    }

    export namespace login {

        /** 服务器数据 */
        export interface Svr {
            /** 服务器id */
            sid: number,
            /** 服务器名 */
            name: string,
            /** 服务器状态 0:关服 1:开启 */
            state: number,
            /** 服务器负载 0:空闲 1:中等 2:繁忙 3:爆满 */
            load: number,
        }

        /** 进入游戏成功给的数据 */
        export interface JoinData {
            /** 开服时间戳 */
            openTime: number,
            /** 玩家基本数据 */
            player: Player,
        }

        /** 玩家基本数据 */
        export interface Player {
            /** 玩家id */
            pid: number,
            /** 服务器id */
            sid: number,
            /** 玩家名 */
            name: string,
            /** 职业id */
            career: number,
            /** 创角时间 */
            createTime: number,
            /** 地图id */
            mapId: number,
        }

        export interface toc_getSvrList {
            svrList: Svr[],
        }

        export interface tos_getSvrHost {
            /** 服务器id */
            sid: number,
        }

        export interface toc_getSvrHost {
            /** 服务器id */
            sid: number,
            /** 服务器地址 */
            host: string,
        }

        export interface tos_connect {
            /** 服务器id */
            sid: number,
            /** 账号(一般来说是个token,为了方便先用user) */
            user: string,
        }

        export interface toc_connect {
            /** 0:连接成功 1:创角 2:连接失败 */
            code: number,
            /** 失败原因 */
            msg?: string,
        }

        export interface tos_createRole {
            /** 玩家名 */
            name: string,
            /** 职业id */
            cid: number,
        }

        export interface toc_createRole {
            /** 0:成功 1:失败 */
            code: number,
            /** 失败原因 */
            msg?: string,
        }

        export interface toc_joinGame {
            /** 0:成功 1:失败 */
            code: number,
            /** 进入游戏成功给的数据 */
            data?: JoinData,
            /** 失败原因 */
            msg?: string,
        }

    }

}